package rauguelu.programaEventos;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.util.ArrayList;

import rauguelu.items.Evento;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;

public class BaseDatosHelper extends SQLiteOpenHelper {
		 
	    //La carpeta por defecto donde Android espera encontrar la Base de Datos de tu aplicaci�n
	    private static String DB_PATH = "/data/data/rauguelu.programaEventos/databases/";
	    private static String DB_NAME = "ProgramaEventos.sqlite";
	    private static String DB_NAME_FERIAS = "ferias.sqlite";
	    private SQLiteDatabase myDataBase; 
	    private SQLiteDatabase myDataBaseFerias;
	 
	    private final Context myContext;
	 
	    /*
	     * Constructor
	     * 
	     * Guarda una referencia al contexto para acceder a la carpeta assets de la aplicaci�n y a los recursos
	     * @param contexto
	     */
	    public BaseDatosHelper(Context contexto) {
	 
	    	super(contexto, DB_NAME, null, 1);
	        this.myContext = contexto;
	    }	
	 
	  /* 
	   * Crea una base de datos vac�a en el sistema y la sobreescribe con la que hemos puesto en Assets
	   */
	    public void crearDataBase() throws IOException{
	 
	    	boolean dbExist = comprobarBaseDatos();
	 
	    	if(dbExist){
	    		//Si ya existe no hacemos nada
	    	}else{
	    		//Si no existe, creamos una nueva Base de datos en la carpeta por defecto de nuestra aplicaci�n, 
	    		//de esta forma el Sistema nos permitir� sobreescribirla con la que tenemos en la carpeta Assets
	        	this.getWritableDatabase();
	        	try {
	    			copiarBaseDatos();
	    		} catch (IOException e) {
	        		throw new Error("Error al copiar la Base de Datos");
	        	}
	    	}
	    }
	    
		  /* 
		   * Crea una base de datos vac�a en el sistema y la sobreescribe con la que hemos puesto en Assets
		   */
		    public void crearDataBaseFerias() throws IOException{
		 
		    	boolean dbExist = comprobarBaseDatosFerias();
		 
		    	if(dbExist){
		    		//Si ya existe no hacemos nada
		    	}else{
		    		//Si no existe, creamos una nueva Base de datos en la carpeta por defecto de nuestra aplicaci�n, 
		    		//de esta forma el Sistema nos permitir� sobreescribirla con la que tenemos en la carpeta Assets
		        	this.getWritableDatabase();
		        	try {
		    			copiarBaseDatosFerias();
		    		} catch (IOException e) {
		        		throw new Error("Error al copiar la Base de Datos");
		        	}
		    	}
		    }
	 
		    private boolean comprobarBaseDatosFerias(){
		    	SQLiteDatabase checkDB = null;
		    	try{
		    		String myPath = DB_PATH + DB_NAME_FERIAS;
		    		checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
		    	}catch(SQLiteException e){
		    		//No existe
		    	}
		 
		    	if(checkDB != null){
		    		checkDB.close();
		    	}
		 
		    	return checkDB != null ? true : false;
		    }
		    
		    
	    /*
	     * Comprobamos si la base de datos existe
	     * @return true si existe, false en otro caso
	     */
	    private boolean comprobarBaseDatos(){
	    	SQLiteDatabase checkDB = null;
	    	try{
	    		String myPath = DB_PATH + DB_NAME;
	    		checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
	    	}catch(SQLiteException e){
	    		//No existe
	    	}
	 
	    	if(checkDB != null){
	    		checkDB.close();
	    	}
	 
	    	return checkDB != null ? true : false;
	    }
	 
	    /*
	     * Copia la base de datos desde la carpeta Assets sobre la base de datos vac�a reci�n creada en la carpeta del sistema,
	     * desde donde es accesible
	     */
	    private void copiarBaseDatos() throws IOException{
	 
	    	//Abrimos la BBDD de la carpeta Assets como un InputStream
	    	InputStream myInput = myContext.getAssets().open(DB_NAME);
	 
	    	//Carpeta de destino (donde hemos creado la BBDD vacia)
	    	String outFileName = DB_PATH + DB_NAME;
	 
	    	//Abrimos la BBDD vacia como OutputStream
	    	OutputStream myOutput = new FileOutputStream(outFileName);
	 
	    	//Transfiere los Bytes entre el Stream de entrada y el de Salida
	    	byte[] buffer = new byte[1024];
	    	int length;
	    	while ((length = myInput.read(buffer))>0){
	    		myOutput.write(buffer, 0, length);
	    	}
	 
	    	//Cerramos los ficheros abiertos
	    	myOutput.flush();
	    	myOutput.close();
	    	myInput.close();
	    }
	    
	    private void copiarBaseDatosFerias() throws IOException{
	   	 
	    	//Abrimos la BBDD de la carpeta Assets como un InputStream
	    	InputStream myInput = myContext.getAssets().open(DB_NAME_FERIAS);
	 
	    	//Carpeta de destino (donde hemos creado la BBDD vacia)
	    	String outFileName = DB_PATH + DB_NAME_FERIAS;
	 
	    	//Abrimos la BBDD vacia como OutputStream
	    	OutputStream myOutput = new FileOutputStream(outFileName);
	 
	    	//Transfiere los Bytes entre el Stream de entrada y el de Salida
	    	byte[] buffer = new byte[1024];
	    	int length;
	    	while ((length = myInput.read(buffer))>0){
	    		myOutput.write(buffer, 0, length);
	    	}
	 
	    	//Cerramos los ficheros abiertos
	    	myOutput.flush();
	    	myOutput.close();
	    	myInput.close();
	    }
	 
	    /*
	     * Abre la base de datos
	     */
	    public void abrirBaseDatos() throws SQLException{
	        String myPath = DB_PATH + DB_NAME;
	    	myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
	 
	    }
	    public void abrirBaseDatosFerias() throws SQLException{
	        String myPath = DB_PATH + DB_NAME_FERIAS;
	    	myDataBaseFerias = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
	 
	    }
	 
	    /*
	     * Cierra la base de datos
	     */
	    @Override
		public synchronized void close() {
	    	    if(myDataBase != null)
	    		    myDataBase.close();
	 
	    	    super.close();
		}
	 
	    
		@Override
		public void onCreate(SQLiteDatabase db) {
			//No usamos este m�todo
		}
	 
		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			//No usamos este m�todo
		}
	 
		private final String TABLE_KEY_EVENTO = "Eventos";

		private final String TABLE_KEY_ID = "id";
		private final String TABLE_KEY_dsCategoria = "dsCategoria";
		private final String TABLE_dsEvento = "dsEvento";
		private final String TABLE_KEY_dsDescripcion = "dsDescripcion";
		private final String TABLE_KEY_cdCategoria = "cdCategoria";
		private final String TABLE_KEY_dsMarcado = "dsMarcado";
		private final String TABLE_KEY_diaEvento = "diaEvento";
		private final String TABLE_KEY_horaEvento = "horaEvento";
		private final String TABLE_KEY_dsGeo = "dsGeo";
		private final String TABLE_KEY_datoBlob = "datoBlob";
		private final String TABLE_KEY_dsWeb = "dsWeb";
		private final String TABLE_KEY_dsDatosAux = "dsDatosAux";
		
		/*
	     * Obtiene todos los eventos desde la Base de Datos
	     */
	     public ArrayList<Evento> GetEventos(){
	     	ArrayList<Evento> listaEventos = new ArrayList<Evento>();
	     	Cursor c = myDataBase.query(TABLE_KEY_EVENTO, 
	     			new String[] {					
	     				TABLE_KEY_ID, TABLE_KEY_cdCategoria, TABLE_KEY_dsCategoria, TABLE_dsEvento,
	     				TABLE_KEY_dsDescripcion, TABLE_KEY_dsMarcado,
	     				TABLE_KEY_diaEvento, TABLE_KEY_horaEvento, TABLE_KEY_dsGeo,
	     				TABLE_KEY_datoBlob, TABLE_KEY_dsWeb, TABLE_KEY_dsDatosAux}, 
	     			null, null, null, null, null,null);
	     	
	     	//Iteramos a traves de los registros del cursor
	     	c.moveToFirst();
	         while (c.isAfterLast() == false) {
	         	Evento evento = new Evento();
	         	evento.setId(c.getString(0));
	         	evento.setCdCategoria(c.getString(1));
	         	evento.setDsCategoria(c.getString(2));
	         	evento.setDsEvento(c.getString(3));
	         	evento.setDsDescripcion(c.getString(4));
	         	evento.setDsMarcado(c.getString(5));
	         	evento.setHoraEvento(c.getString(6));
	         	evento.setDsGeo(c.getString(7));
	         	evento.setDatoBlob(c.getBlob(8));
	         	evento.setDsWeb(c.getString(9));
	         	evento.setDsDatosAux(c.getString(10));
	         	listaEventos.add(evento);
	        	    c.moveToNext();
	         }
	         c.close();
	         
	         return listaEventos;
	     }
	     
	     

		/*
	     * Obtiene todos los libros desde la Base de Datos
	     */
	     public ArrayList<Evento> GetElementosFiltrados(){
	     	ArrayList<Evento> listaEventos = new ArrayList<Evento>();
	     	
     	
	     	Cursor c = myDataBase.query(TABLE_KEY_EVENTO, 
	     			new String[] {					
	     				TABLE_KEY_ID, TABLE_KEY_cdCategoria, TABLE_KEY_dsCategoria, TABLE_dsEvento,
	     				TABLE_KEY_dsDescripcion, TABLE_KEY_dsMarcado,
	     				TABLE_KEY_diaEvento, TABLE_KEY_horaEvento, TABLE_KEY_dsGeo,
	     				TABLE_KEY_datoBlob, TABLE_KEY_dsWeb, TABLE_KEY_dsDatosAux}, 
	     			null, null, null, null, null,null);
	     	
	     	//Iteramos a traves de los registros del cursor
	     	c.moveToFirst();
	         while (c.isAfterLast() == false) {
	         	Evento evento = new Evento();
	         	evento.setId(c.getString(0));
	         	evento.setCdCategoria(c.getString(1));
	         	evento.setDsCategoria(c.getString(2));
	         	evento.setDsEvento(c.getString(3));
	         	evento.setDsDescripcion(c.getString(4));
	         	evento.setDsMarcado(c.getString(5));
	         	evento.setHoraEvento(c.getString(6));
	         	evento.setDsGeo(c.getString(7));
	         	evento.setDatoBlob(c.getBlob(8));
	         	evento.setDsWeb(c.getString(9));
	         	evento.setDsDatosAux(c.getString(10));
	         	
	         	if(evento.getDsMarcado().equals("S"))
	         		listaEventos.add(evento);
	         			
	        	    c.moveToNext();
	         }
	         c.close();
	         
	         return listaEventos;
	     }
	     
	     /*
		     * Obtiene todos los libros desde la Base de Datos
		     */
		     public int countElementos(){
		     	Cursor c = myDataBase.query(TABLE_KEY_EVENTO, 
		     			new String[] {TABLE_KEY_ID}, 
		     			null, null, null, null, null,null);
		     	
		     	//Iteramos a traves de los registros del cursor
		     	return c.getCount();
		     	
		     }
		     
		     /*
			     * Obtiene todos los libros desde la Base de Datos
			     */
			     public ArrayList<Evento> GetEventoDia(String diaEvento){
			     	ArrayList<Evento> listaEventos = new ArrayList<Evento>();
			     	
			     	Cursor c = myDataBase.query(TABLE_KEY_EVENTO, 
			     			new String[] {					
			     				TABLE_KEY_ID, TABLE_KEY_cdCategoria, TABLE_KEY_dsCategoria, TABLE_dsEvento,
			     				TABLE_KEY_dsDescripcion, TABLE_KEY_dsMarcado,
			     				TABLE_KEY_diaEvento, TABLE_KEY_horaEvento, TABLE_KEY_dsGeo,
			     				TABLE_KEY_datoBlob, TABLE_KEY_dsWeb, TABLE_KEY_dsDatosAux}, 
			     			null, null, null, null, null,null);
			     	
			     	//Iteramos a traves de los registros del cursor
			     	c.moveToFirst();
			     	  while (c.isAfterLast() == false) {
			         	Evento evento = new Evento();
			         	evento.setId(c.getString(0));
			         	evento.setCdCategoria(c.getString(1));
			         	evento.setDsCategoria(c.getString(2));
			         	evento.setDsEvento(c.getString(3));
			         	evento.setDsDescripcion(c.getString(4));
			         	evento.setDsMarcado(c.getString(5));
			         	evento.setDiaEvento(c.getString(6));
			         	evento.setHoraEvento(c.getString(7));
			         	evento.setDsGeo(c.getString(8));
			       //  	evento.setDatoBlob(c.getBlob(9));
			         	evento.setDsWeb(c.getString(10));
			         	evento.setDsDatosAux(c.getString(11));
			         	
			         	if(evento.getDiaEvento().toString().equals(diaEvento.toString()))
			         		listaEventos.add(evento);
			        	
			         	c.moveToNext();
			         }
			         c.close();
			         
			         return listaEventos;
			     }
}
